const path = require('path');

const { VueLoaderPlugin } = require('vue-loader');

const htmlWebpackPlugin = require('html-webpack-plugin');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const { CleanWebpackPlugin } = require("clean-webpack-plugin");

module.exports = {
  entry: './src/main.js',
  output: {
    filename: 'bundle.[contenthash:8].js',
    path: path.resolve(__dirname, 'dist'),
    clean: true, // 每次构建清理dist文件
  },
  module: {
    rules: [
      {
        test: /\.vue$/,
        loader: "vue-loader"
      },
      // @babel/core中不包含@vue/cli-plugin-babel,单独安装
      {
        test: /\.js$/,
        use: "babel-loader",
      },
      {
        test: /\.(less|css)$/,
        // use 数组执行顺序由最后一个到第一个
        use: [
          // 将css单独打包，小于150kb可不用
          MiniCssExtractPlugin.loader,
          "css-loader",
          "less-loader",
        ]
      },
      /** 
       * webpack5 废弃了通过url-loader&file-loader方式处理字体/图片文件
       * asset/resource 发送一个单独的文件并导出 URL。之前通过使用 file-loader 实现。
       * asset/inline 导出一个资源的 data URI。之前通过使用 url-loader 实现。
       * asset/source 导出资源的源代码。之前通过使用 raw-loader 实现。
       * asset 在导出一个 data URI 和发送一个单独的文件之间自动选择。之前通过使用 url-loader，并且配置资源体积限制实现。
      */
      {
        test: /\.(png|jpg|gif)$/,
        // use: [
        //   {
        //     loader: 'url-loader',
        //     // 超出1024字节会使用file-loader
        //     options: {
        //       limit: 10 * 1024
        //     }
        //   }
        // ]
        type: 'asset'
      }
    ]
  },
  plugins: [
    // 请确保引入这个插件来施展魔法
    new VueLoaderPlugin(),
    // 单独打包css的plugin
    new MiniCssExtractPlugin({
      filename: 'main.[contenthash:8].css'
    }),
    // 清除构建目录
    new CleanWebpackPlugin(),
    new htmlWebpackPlugin({
      title: 'webpack vue',
      template: './public/index.html',
      templateParameters: {
        BASE_URL: 'public/'
      }
    })
  ]
}